#pragma once
#include "../../src_baseClasses/Data.h"
#include "../../src_baseClasses/DiagramData.h"
#include "../../src_baseClasses/dataStructUI.h"
#include "Style_grid.h"


class Data_grid : public Data, public DiagramData {
public:
	Data_grid() { setupStyleManager(); }
	~Data_grid() {}

	int m_pinSum = 0;
	//2.绘制的背景（读取出来的数据，算法执行所用的数据）
	std::vector<QString> m_mapSymbols;

	//3.绘制障碍物
	std::vector<QPointF> m_Pts;                    //背景障碍物（1.布线赋值）

	//4.算法数据
	std::vector<LineUI> m_flyLines;                     //一条折线（1.布线赋值，用作显示飞线）
	std::vector<QPointF> m_cornerPts;					//计划点
	std::vector<std::vector<LineUI>> m_wires;           //折线集合（1,2.推线与后处理赋值）

	std::vector<std::vector<QPointF>> m_wiresPts;		//预布线点
	std::vector<std::vector<QPointF>> m_resWiresPts;	//布线点被处理之后（手动调整）

	double m_totalWireLength = 0;

	void clear() {
		//1.父类中的数据
		Data::clear();

		//2.绘制的背景（读取出来的数据，算法执行所用的数据）
		m_mapSymbols.clear();

		//3.绘制障碍物
		m_Pts.clear();                  //背景障碍物（1.布线赋值）

		//4.算法数据
		m_flyLines.clear();             //一条折线（1.布线赋值，用作显示飞线）
		m_cornerPts.clear();			//计划点
		m_wires.clear();                //折线集合（1,2.推线与后处理赋值）
		m_wiresPts.clear();
		m_totalWireLength = 0;

	}

	// 实现DiagramData接口
	QPointF* getMinPoint() override { return &minPt; }
	QPointF* getMaxPoint() override { return &maxPt; }

	// 1.设置背景信息(优先绘制的内容)
	void set_canvas_info_back(
		std::vector<std::vector<QPointF>*>& pts1, std::vector<PointStyle*>& ss_pts1,
		std::vector<std::vector<LineUI>*>& lines1, std::vector<LineStyle*>& ss_lines1,
		std::vector<std::vector<LineUI>*>& polys1, std::vector<PolygonStyle*>& ss_polys1,
		std::vector<std::vector<LineUI>*>& linePts1, std::vector<PointStyle*>& ss_linePts1,
		std::vector<std::vector<CircleUI>*>& circle1, std::vector<PolygonStyle*>& ss_circle1
	) {
		//1.1 点：障碍物
		pts1.emplace_back(&m_Pts);
		ss_pts1.emplace_back(m_styles.getPointStyle(m_styleInfo.obsPtKey));
		//1.2 点：规划点
		pts1.emplace_back(&m_cornerPts);
		ss_pts1.emplace_back(m_styles.getPointStyle(m_styleInfo.cornerPtKey));
		//1.3 点：预布线点
		size_t ptSum = m_wiresPts.size();
		for (size_t i = 0; i < ptSum; i++)
			pts1.emplace_back(&m_wiresPts[i]);
		ss_pts1.resize(ss_pts1.size() + ptSum);
		const auto& style = m_styles.getPointStyle(m_styleInfo.pathPtKey);
		std::fill(ss_pts1.end() - ptSum, ss_pts1.end(), style);
		//1.4 点：最终布线点
		size_t resPtSum = m_resWiresPts.size();
		for (size_t i = 0; i < resPtSum; i++)
			pts1.emplace_back(&m_resWiresPts[i]);
		ss_pts1.resize(ss_pts1.size() + resPtSum);
		const auto& resStyle = m_styles.getPointStyle(m_styleInfo.resPathPtKey);
		std::fill(ss_pts1.end() - resPtSum, ss_pts1.end(), resStyle);
		//2.1 线：
		//3.1 多边形：
		//4.1 线段端点：
	};
	// 2.设置前景绘图信息(后绘制的内容，会将先绘制的内容挡住)
	void set_canvas_info_front(
		std::vector<std::vector<QPointF>*>& pts2, std::vector<PointStyle*>& ss_pts2,
		std::vector<std::vector<LineUI>*>& lines2, std::vector<LineStyle*>& ss_lines2,
		std::vector<std::vector<LineUI>*>& polys2, std::vector<PolygonStyle*>& ss_polys2,
		std::vector<std::vector<LineUI>*>& linePts2, std::vector<PointStyle*>& ss_linePts2,
		std::vector<std::vector<CircleUI>*>& circle2, std::vector<PolygonStyle*>& ss_circle2
	) {
		//1.1 点：
		//2.1 线：飞线
		lines2.emplace_back(&m_flyLines);
		ss_lines2.emplace_back(m_styles.getLineStyle(m_styleInfo.flyLineKey));
		//2.2 线：走线
		size_t lineSum = m_wires.size();
		for (size_t i = 0; i < lineSum; i++)
			lines2.emplace_back(&m_wires[i]);
		ss_lines2.reserve(ss_lines2.size() + lineSum);
		const auto& style2 = m_styles.getLineStyle(m_styleInfo.pathLineKey);
		std::fill_n(std::back_inserter(ss_lines2), lineSum, style2);
		//3.1 多边形：
		//4.1 线段端点：
		linePts2.emplace_back(&m_flyLines);
		ss_linePts2.emplace_back(m_styles.getPointStyle(m_styleInfo.pinPtKey));
	};
	
public:
	//定义绘图样式
	Style_grid m_styleInfo = Style_grid();
private:

	void setupStyleManager() {
		m_styles.setPointStyle(m_styleInfo.pointStyleKeys, m_styleInfo.pointStyles);
		m_styles.setLineStyle(m_styleInfo.lineStyleKeys, m_styleInfo.lineStyles);
		m_styles.setPolygonStyle(m_styleInfo.polygonStyleKeys, m_styleInfo.polygonStyles);
	}
};
